package model

import (
	"github.com/jinzhu/gorm"
	_const "go-admin/internal/model/const"
)

type Menu struct {
	CommonModel
	IsBanned      string `json:"isBanned"`      // 是否禁用
	Remark        string `json:"remark"`        // 备注信息
	RouteName     string `json:"routeName"`     // 路由名称
	MenuTitle     string `json:"menuTitle"`     // 菜单标题
	Icon          string `json:"icon"`          // 菜单图标
	Path          string `json:"path"`          // 当前路由或当前接口地址
	MenuPath      string `json:"menuPath"`      // 当前路由的路径
	MenuType      string `json:"menuType"`      // 菜单类型
	Action        string `json:"action"`        // http请求方式
	Permission    string `json:"permission"`    // 权限标识
	ParentId      string `json:"parentId"`      // 父id
	ComponentPath string `json:"componentPath"` // 组件路径
	IsVisible     string `json:"isVisible"`     // 是否可见
	IsIframe      string `json:"isIframe"`      // 是否是iframe外链
}

// 重置表名
func (m *Menu) TableName() string {
	return "sys_menu"
}

// 获取列表
func (m *Menu) ListAll(db *gorm.DB) ([]*Menu, error) {
	var munus []*Menu
	var err error
	if err = db.Where("is_del = ?", _const.ISDEL).Where("is_banned = ?", _const.ISBANNED).Find(&munus).Error; err != nil {
		return nil, err
	}
	return munus, nil
}

// 根据角色获取列表
func (m *Menu) ListByRoleKey(db *gorm.DB, roleKey []string) ([]*Menu, error) {
	munus := make([]*Menu, 0)
	var err error
	db = db.Table("sys_role_menu srm").Select("sm.*").Joins("LEFT JOIN sys_role sr ON sr.id = srm.role_id").Joins("LEFT JOIN sys_menu sm ON srm.menu_id = sm.id").Where("sr.role_key IN (?)", roleKey)
	if err = db.Where("is_del = ?", _const.ISDEL).Where("is_banned = ?", _const.ISBANNED).Find(&munus).Error; err != nil {
		return nil, err
	}
	return munus, nil
}

// 创建
func (m *Menu) Create(db *gorm.DB) error {
	return db.Create(&m).Error
}

func (m *Menu) GetDeptByMenuTitle(db *gorm.DB, menuTitle string) (*Menu, error) {
	var menu Menu
	if err := db.Where("menu_title = ?", m.MenuTitle).First(&menu).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &menu, nil
		case err != nil:
			return &menu, err
		}
	}
	return &menu, nil
}

// 更新
func (m *Menu) Update(db *gorm.DB, values interface{}) error {
	if err := db.Model(&m).Updates(values).Where("id = ?", m.Id).Error; err != nil {
		return err
	}
	return nil
}

// 根据部门id获取部门信息
func (m *Menu) GetMenuById(db *gorm.DB, id string) (*Menu, error) {
	var menu Menu
	if err := db.Where("is_del = ?", _const.ISDEL).Where("id = ?", id).First(&menu).Error; err != nil {
		// 判断错误
		switch {
		case err == gorm.ErrRecordNotFound:
			// 说明没有找到
			return &menu, nil
		case err != nil:
			return &menu, err
		}
	}
	return &menu, nil
}

// 软删除
func (m *Menu) Delete(db *gorm.DB, values interface{}) error {
	if err := db.Model(&m).Updates(values).Where("id = ?", m.Id).Error; err != nil {
		return err
	}
	return nil
}

// 根据菜单ids获取指定类型的菜单
func (m *Menu) GetMenuInType(db *gorm.DB, menuIds []string, menuType string) ([]*Menu, error) {
	var munus []*Menu
	var err error
	db = db.Where("id IN (?)", menuIds).Where("menu_type = ?", menuType)
	if err = db.Where("is_del = ?", _const.ISDEL).Where("is_banned = ?", _const.ISBANNED).Find(&munus).Error; err != nil {
		return nil, err
	}
	return munus, nil
}
